<?php
defined('ANT_ACCESS') or die('Access denided');
/**
 * Ant Framework
 *
 * An open source application development framework for PHP 5
 *
 * @package		Ant Framework
 * @author		Meshin Dmitriy
 * @copyright	Copyright (c) 2008, Meshin Dmitriy
 * @license		GNU Public Lisence v2
 * @link		http://code.google.com/p/ant-framework
 * @desc		MYSQL driver class
 **/
class ANT_mysql implements database{
	//	строка запроса на возвращение количества записей
	protected $count_string = 'SELECT COUNT(*) AS ';
	//	ключевое слово базы данных для возвращения случайной записи
	protected $random_keyword = ' RAND()';
	//	автоочистка запросов
	protected $delete_hack = TRUE;
	//	имя пользователя
	protected $username;
	//	пароль
	protected $password;
	//	имя хоста
	protected $hostname;
	//	имя БД
	protected $database;
	//	префикс БД
	protected $dbprefix;
	//	кодировка
	protected $char_set = 'utf8';
	//	сопоставление
	protected $db_collat = 'utf8_general_ci';
	//	порт
	protected $port = '';
	//	постоянное соединение
	protected $pconnect = FALSE;
	//	айди соединения
	protected $conn_id = FALSE;
	//	айди результата
	protected $result_id = FALSE;
	//	количество запросов
	protected $query_count = 0;
	//	разрешение транзакций
	protected $trans_enabled = TRUE;
	
	/*
	 * 	Соединение с БД
	 * */
	function db_connect(){
		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
	}
	
	/*
	 * 	Постоянное соединение с БД
	 * */
	function db_pconnect(){
		return @mysql_pconnect($this->hostname, $this->username, $this->password);
	}
	
	/*
	 * 	Выбор базы данных
	 * */
	function db_select(){
		return @mysql_select_db($this->database, $this->conn_id);
	}
	
	/*
	 * 	Установка кодировки
	 * */
	function db_set_charset($charset, $collation){
		return @mysql_query("SET NAMES '".$this->escape_str($charset)."' COLLATE '".$this->escape_str($collation)."'", $this->conn_id);
	}
	
	/*
	 * 	Начало транзакции
	 * */
	function trans_begin($test_mode = FALSE){
		//	если транзакции запрещены или это вложенная транзакция
		if(!$this->trans_enabled OR $this->trans_depth > 0){
			return TRUE;
		}
		$this->trans_failure = (TRUE === $test_mode) ? TRUE : FALSE;
		$this->_execute('SET AUTOCOMMIT=0');
		$this->_execute('START TRANSACTION');
		return TRUE;
	}
	
	/*
	 * 	Подтверждение транзакции
	 * */
	function trans_commit(){
		//	если транзакции запрещены или это вложенная транзакция
		if(!$this->trans_enabled OR $this->trans_depth > 0){
			return TRUE;
		}
		$this->_execute('COMMIT');
		$this->_execute('SET AUTOCOMMIT=1');
		return TRUE;				
	}
	
	/*
	 * 	Откат транзакции
	 * */
	function trans_rollback(){
		//	если транзакции запрещены или это вложенная транзакция
		if(!$this->trans_enabled OR $this->trans_depth > 0){
			return TRUE;
		}
		$this->_execute('ROLLBACK');
		$this->_execute('SET AUTOCOMMIT=1');
		return TRUE;
	}
	
	/*
	 * 	Экранирование
	 * */
	function escape_str($str){
		if (is_array($str)){
			foreach($str as $key => $val){
				$str[$key] = $this->escape_str($val);
			}
    		return $str;
    	}
		try{
			return mysql_real_escape_string($str, $this->conn_id);
		}
		catch(Exception $e){
			try{
				return mysql_escape_string($str);
			}
			catch(Exception $e){
				return addslashes($str);
			}
		}
	}
	
	/*
	 * 	Количество затронутых рядов
	 * */
	function affected_rows(){
		return @mysql_affected_rows($this->conn_id);
	}
	
	/*
	 * 	Айди вставленной записи
	 * */
	function insert_id(){
		return @mysql_insert_id($this->conn_id);
	}
	
	/*
	 * 	Возвращение количества записей в таблице
	 * */
	function count_all($table = ''){
		if($table == ''){
			return 0;
		}
		
		$query = $this->query($this->count_string.' numrows FROM '.$this->dbprefix.$table);
		$row = $query->row();
		return (int)$row->numrows;
	}
	
	/*
	 * 	Формирование запроса - версия СУБД
	 * */
	function _version();
	
	/*
	 * 	Выполнение запроса
	 * */
	function _execute($sql);
	
	/*
	 * 	Формирование запроса - список таблиц в БД
	 * */
	function _list_tables($prefix_limit = FALSE);
	
	/*
	 * 	Формирование запроса - список полей в таблице
	 * */
	function _list_columns($table = '');
	
	/*
	 *  Формирование запроса - возвращение последней записи
	 * */
	function _field_data($table);
	
	/*
	 * 	Возвращение сообщения об ошибке
	 * */
	function _error_message();
	
	/*
	 * 	Возвращение номера ошибки
	 * */
	function _error_number();
	
	/*
	 * 	Экраниерование имени таблицы
	 * */
	function _escape_table($table);
	
	/*
	 * 	Формирование запроса - выборка из таблиц
	 * */
	function _from_tables($tables);
	
	/*
	 * 	Формирование запроса - ввод в таблицу
	 * */
	function _insert($table, $keys, $values);
	
	/*
	 * 	Формирование запроса - обновление записи
	 * */
	function _update($table, $values, $where, $orderby = array(), $limit = FALSE);
	
	/*
	 * 	Формирование запроса - усечение таблицы
	 * */
	function _truncate($table);
	
	/*
	 * 	Формирование запроса - удаление из таблицы
	 * */
	function _delete($table, $where = array(), $like = array(), $limit = FALSE);
	
	/*
	 * 	Формирование запроса - лимит
	 * */
	function _limit($sql, $limit, $offset);
	
	/*
	 * 	Формирование запроса - закрытие соединения
	 * */
	function _close($conn_id);
}
?>